package br.edu.unilasalle.simon_api.domain;

// Generated 08/03/2014 18:19:52 by Hibernate Tools 4.0.0

import static javax.persistence.GenerationType.IDENTITY;

import java.util.Date;
import java.util.HashSet;
import java.util.Set;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.Transient;

import org.codehaus.jackson.annotate.JsonIgnore;
import org.codehaus.jackson.annotate.JsonIgnoreProperties;

/**
 * Venda generated by hbm2java
 */
@Entity
@Table(name = "venda", catalog = "simon")
@JsonIgnoreProperties(value = { "handler", "hibernateLazyInitializer", "pagamentos", "valorParcela" })
public class Venda extends BaseEntity<Long> {

	private static final long serialVersionUID = 2824195918406880827L;
	
	@Id
	@GeneratedValue(strategy = IDENTITY)
	@Column(name = "id", unique = true, nullable = false)
	private Long id;
	
	@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "id_usuario", nullable = false)
	private Usuario usuario;
	
	@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "id_cliente", nullable = false)
	private Cliente cliente;
	
	@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "id_loja", nullable = false)
	private Loja loja;
	
	@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "id_forma_pagamento", nullable = false)
	private FormaPagamento formaPagamento;
	
	@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "id_funcionario", nullable = false)
	private Funcionario funcionario;
	
	@Column(name = "nota_fiscal", nullable = false, length = 20)
	private String notaFiscal;
	
	@Temporal(TemporalType.TIMESTAMP)
	@Column(name = "data_venda", length = 19)
	private Date dataVenda;
	
	@Column(name = "parcelas", nullable = false)
	private Integer parcelas;
	
	@Column(name = "valor_total", nullable = false, precision = 12, scale = 2)
	private Double valorTotal;
	
	@OneToMany(fetch = FetchType.LAZY, mappedBy = "venda", cascade = CascadeType.ALL)
	private Set<ItemVenda> itemVendas = new HashSet<ItemVenda>(0);
	
	@OneToMany(fetch = FetchType.LAZY, mappedBy = "venda", cascade = CascadeType.ALL)
	private Set<Pagamento> pagamentos = new HashSet<Pagamento>(0);
	
	@Transient
	private Double valorParcela;

	public Venda() {
	}
	
	public Venda(Date dataVenda, Integer parcelas, Double valorTotal, String funcNome, 
			String funcSobrenome, String cliNome, String cliSobrenome) {
		this.dataVenda = dataVenda;
		this.parcelas = parcelas;
		this.valorTotal = valorTotal;
		this.funcionario = new Funcionario();
		this.funcionario.setNome(funcNome);
		this.funcionario.setSobrenome(funcSobrenome);
		this.cliente = new Cliente();
		this.cliente.setNome(cliNome);
		this.cliente.setSobrenome(cliSobrenome);
	}

	public Venda(Usuario usuario, Cliente cliente, Loja loja,
			FormaPagamento formaPagamento, Funcionario funcionario,
			String notaFiscal, Integer parcelas, Double valorTotal) {
		this.usuario = usuario;
		this.cliente = cliente;
		this.loja = loja;
		this.formaPagamento = formaPagamento;
		this.funcionario = funcionario;
		this.notaFiscal = notaFiscal;
		this.parcelas = parcelas;
		this.valorTotal = valorTotal;
	}

	public Venda(Usuario usuario, Cliente cliente, Loja loja,
			FormaPagamento formaPagamento, Funcionario funcionario,
			String notaFiscal, Date dataVenda, Integer parcelas, Double valorTotal,
			Set<ItemVenda> itemVendas, Set<Pagamento> pagamentos) {
		this.usuario = usuario;
		this.cliente = cliente;
		this.loja = loja;
		this.formaPagamento = formaPagamento;
		this.funcionario = funcionario;
		this.notaFiscal = notaFiscal;
		this.dataVenda = dataVenda;
		this.parcelas = parcelas;
		this.valorTotal = valorTotal;
		this.itemVendas = itemVendas;
		this.pagamentos = pagamentos;
	}

	public Long getId() {
		return this.id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	public Usuario getUsuario() {
		return this.usuario;
	}

	public void setUsuario(Usuario usuario) {
		this.usuario = usuario;
	}

	public Cliente getCliente() {
		return this.cliente;
	}

	public void setCliente(Cliente cliente) {
		this.cliente = cliente;
	}

	public Loja getLoja() {
		return this.loja;
	}

	public void setLoja(Loja loja) {
		this.loja = loja;
	}

	public FormaPagamento getFormaPagamento() {
		return this.formaPagamento;
	}

	public void setFormaPagamento(FormaPagamento formaPagamento) {
		this.formaPagamento = formaPagamento;
	}

	public Funcionario getFuncionario() {
		return this.funcionario;
	}

	public void setFuncionario(Funcionario funcionario) {
		this.funcionario = funcionario;
	}

	public String getNotaFiscal() {
		return this.notaFiscal;
	}

	public void setNotaFiscal(String notaFiscal) {
		this.notaFiscal = notaFiscal;
	}

	public Date getDataVenda() {
		return this.dataVenda;
	}

	public void setDataVenda(Date dataVenda) {
		this.dataVenda = dataVenda;
	}

	public Integer getParcelas() {
		return this.parcelas;
	}

	public void setParcelas(Integer parcelas) {
		this.parcelas = parcelas;
	}

	public Double getValorTotal() {
		return this.valorTotal;
	}

	public void setValorTotal(Double valorTotal) {
		this.valorTotal = valorTotal;
	}

	@JsonIgnore
	public Set<ItemVenda> getItemVendas() {
		return this.itemVendas;
	}

	public void setItemVendas(Set<ItemVenda> itemVendas) {
		this.itemVendas = itemVendas;
	}

	@JsonIgnore
	public Set<Pagamento> getPagamentos() {
		return this.pagamentos;
	}

	public void setPagamentos(Set<Pagamento> pagamentos) {
		this.pagamentos = pagamentos;
	}

	public Double getValorParcela() {
		return valorParcela;
	}

	public void setValorParcela(Double valorParcela) {
		this.valorParcela = valorParcela;
	}
	
}
